#pragma once

#include <QtGlobal>

// 结果码
enum ResultCode {
    ADD_FRIEND_ALLOW,               // "添加{0}为好友成功。"
    ADD_FRIEND_NOT_ALLOW,           // "拒绝和你成为好友。"
    ALREADY_BE_FRIENDS,             // "已经是你的好友了。"
    FRIEND_NAME_EQUAL_SELF_NAME,    // "好友名字与自己名字相同。"
    LOGON_SUCCEEDED,                // "登录成功。"
    NETWORK_ERROR,                  // "连接服务失败，请参考使用说明。"
    PASSWORD_WRONG,                 // "密码不正确。"
    REG_SUCCEEDED,                  // "注册成功。"
    SUCCEEDED,                      // ""
    TOO_MANY_FRIENDS,               // "朋友太多了，不能再继续添加了。"
    USER_ALREADY_LOGON,             // "该用户已经登录了。"
    USER_EXISTS,                    // "该用户名已经被注册了。"
    USER_NOT_FOUND                  // "该用户尚未注册。"
};

// 协议
class ImProtocol {
    // 类型
    public: enum Type {
        ADD_FRIEND_REQUEST, // 添加好友请求
        ADD_FRIEND_RESULT,  // 添加好友结果
        CHAT,               // 聊天
        FRIEND_LOGON,       // 好友登录
        LOGOFF,             // 离线
        LOGON,              // 登录
        REG                 // 注册
    };

    public: static const int MAX_CONTENT_LEN = 1023;                    // 一次发送的最大聊天内容长度
    public: static const int CONTENT_BUF_LEN = MAX_CONTENT_LEN + 1;     // 聊天内容缓存长度
    public: static const int DATE_TIME_BUF_LEN = 20;                    // 时间缓存长度
    public: static const int MAX_PASSWORD_LEN = 16;                     // 最大密码长度
    public: static const int MAX_USER_COUNT = 50;                       // 最大用户数
    public: static const int MAX_USERNAME_LEN = 16;                     // 最大用户名长度
    public: static const char* MULTI_CHAT;                              // 群发消息标志
    public: static const int PASSWORD_BUF_LEN = MAX_PASSWORD_LEN + 1;   // 密码缓存长度
    public: static const char* SERVER_IP;                               // 服务器 IP 地址
    public: static const int SERVER_PORT = 5000;                        // 服务器端口号
    public: static const int USERNAME_BUF_LEN = MAX_USERNAME_LEN + 1;   // 用户名缓存长度
    public: Type mType;                                                 // 协议类型

    public: ImProtocol(Type type);
    public: virtual ~ImProtocol();
};

// 用户信息
class UserInfo {
    public: int mIconIndex;                                 // 头像索引
    public: char mPassword[ImProtocol::PASSWORD_BUF_LEN];   // 密码
    public: char mUsername[ImProtocol::USERNAME_BUF_LEN];   // 用户名

    public: UserInfo();
    public: UserInfo(int, const char*, const char*);
};

// 添加好友请求
class AddFriendRequest: public ImProtocol {
    public: char mDstUsername[USERNAME_BUF_LEN];    // 目标用户名
    public: int mIconIndex;                         // 源用户头像索引
    public: char mSrcUsername[USERNAME_BUF_LEN];    // 源用户名

    public: AddFriendRequest(const char*, int, const char*);
};

// 添加好友结果
class AddFriendResult: public ImProtocol {
    public: int mDstIconIndex;                      // 目标用户头像索引
    public: char mDstUsername[USERNAME_BUF_LEN];    // 目标用户名
    public: ResultCode mResultCode;                 // 结果码
    public: char mSrcUsername[USERNAME_BUF_LEN];    // 源用户名

    public: AddFriendResult(int, const char*, ResultCode, const char*);
};

// 聊天信息
class ChatInfo: public ImProtocol {
    public: char mContent[CONTENT_BUF_LEN];         // 内容
    public: char mDstUsername[USERNAME_BUF_LEN];    // 目标用户名
    public: char mSrcUsername[USERNAME_BUF_LEN];    // 源用户名
    public: char mTime[DATE_TIME_BUF_LEN];          // 生成时间

    public: ChatInfo(const char*, const char*, const char*, const char*);
};

// 好友登录通知
class FriendLogon: public ImProtocol {
    public: char mUsername[USERNAME_BUF_LEN];   // 用户名

    public: FriendLogon(const char*);
};

// 离线请求
class LogoffRequest: public ImProtocol {
    public: char mUsername[USERNAME_BUF_LEN];   // 用户名

    public: LogoffRequest(const char*);
};

// 登录请求
class LogonRequest: public ImProtocol {
    public: UserInfo mUserInfo; // 用户信息

    public: LogonRequest(const char*, const char*);
};

// 登录结果
class LogonResult: public ImProtocol {
    public: int mFriendCount;                       // 好友数
    public: UserInfo mFriends[MAX_USER_COUNT];      // 好友列表
    public: bool mFriendsOnline[MAX_USER_COUNT];    // 好友在线状态列表
    public: int mIconIndex;                         // 头像索引
    public: ResultCode mResultCode;                 // 结果码

    LogonResult();
};

// 注册请求
class RegRequest: public ImProtocol {
    public: UserInfo mUserInfo; // 用户信息

    public: RegRequest(int, const char*, const char*);
};

// 注册结果
class RegResult: public ImProtocol {
    public: ResultCode mResultCode; // 结果码

    public: RegResult();
};
